home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / util / rexx / Scion2html.lha / Scion2html.rexx
Encoding:
OS/2 REXX Batch file  |  1995-06-14  |  58.3 KB  |  1,703 lines

  1. /* © Harold H. Ipolyi        11 June 1994, 1995
  2.  
  3.               ( lha a Scion2html Scion2html.rexx )
  4.  
  5. -------------------------------README----------------------------------------
  6. Short:    makes html's from ScionGenealogist database
  7. Uploader: ipolyi@pat.mdc.com (Harold H. Ipolyi)
  8. Author:   Harold H. Ipolyi
  9. Type:     util/rexx
  10.  
  11. Important: replaces previous version called "ScionToMosaic.rexx"
  12.  
  13. :  an ARexx script to make html hypertexts from ScionGenealogist data bases
  14.  
  15. New: now includes PICTURES culled from PP{IRN}.DBNAME as inline links
  16.                   (please see PP & FP Notes)
  17.  
  18. Prerequisites: ScionGenealogist V 3.13 (or greater) by Rob Akins
  19.                html viewer (Mosaic, etc.)
  20.  
  21.          also:    (to incorporate and display pictures:)
  22.  
  23.                GfxCon V1.6 (or greater) by Dirk Farin (in Sys:Tools)
  24.                Amiga OS 3.0 (or greater) for picture datatypes
  25.  
  26. Release History:
  27.  
  28.  11 Jun 1994 . ScionToMosaic.rexx for ScionGenealogist V 3.06
  29.  
  30.  19 Jun 1994 . MakeDir(Gdir) fixed; extra comments processed.
  31.  
  32.  25 Jun 1994 . Fixed descenders; Women in List italicised
  33.              . updated for ScionGenealogist V 3.13
  34.  
  35.   3 Sep 1994 . Replace occurrences of "<ScionIRN>" by NAMES from DB
  36.              . e.g. Replace <101> by Iam Onehundredone, Jr.
  37.              . Added Family Info file processing; Ancestor trees
  38.              . Added descendant charts
  39.              . Women italicised; men boldface everywhere
  40.              . Added creation of a textual file "GenealogyOf..."
  41.  
  42.   1 Mar 1995 . cleaned up bugs in creation of textual files
  43.  
  44.   6 Jun 1995 . renamed ScionToMosaic to Scion2html
  45.              .   (somehow it kept winding up in "music" on AmiNet)
  46.              . date format in "ancestors" section normalized
  47.              . images used as links to picture albums (see
  48.              .  PP & FP Notes) and links to pictures
  49.              . GfxCon V1.6 used for picture copying and reducing
  50.              . recoded for DOS/Windows restricted 8.3 file names
  51.              .
  52.  
  53.  WHY?    others in my family don't have Amigas
  54.  
  55.     ScionGenealogist by Rob Akins is easy to use, comprehensive,
  56.     and provides Arexx ports for extracting data.
  57.  
  58.     An ARexx script can repeatedly and painlessly recreate
  59.     html files from entries in a ScionGenealogist data base.
  60.  
  61.     Mosaic, etc are available common methods of presentation.
  62.  
  63.  TESTED:    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  64.         &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  65.         w/ ScionGenealogist V 3.06 & Mosaic1.2NoNet
  66.         w/ ScionGenealogist V 3.13 & Mosaic1.3betaAmitcp
  67.  
  68.         html file compatibility tested on Sun NCSA Mosaic
  69.  
  70. -------------------------------README----------------------------------------
  71.   -----------------------------------------------------------------
  72.  | This Script is somewhat dependent on the following conventions  |
  73.  | that I followed in my ScionGenealogist data base:               |
  74.  |                                                                 |
  75.  | ·  lastnames are kept pure (no honorifics, Jr's, III's )        |
  76.  |                                                                 |
  77.  | ·  given names have any and all honorifics AFTER a COMMA        |
  78.  |                                                                 |
  79.  |  for example:  LastName      FirstNames, honorifics             |
  80.  |                                                                 |
  81.  |                BAUER-GAUSS   Joseph, Dr.                        |
  82.  |                DAGLEY        Richard Kelley, Jr.                |
  83.  |                                                                 |
  84.  |-----------------------------------------------------------------|
  85.  |                                                                 |
  86.  |  For a name change (NOT maidenname > marriedname), try this:    |
  87.  |                New           Birth Name > Changed To, Ph. D.    |
  88.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  89.  |                                                                 |
  90.   -----------------------------------------------------------------
  91. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  92. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  93. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  94. »«                                                                »«
  95. «» GetLastName: PROCEDURE at end of script capitalizes Last Names »«
  96. «» -------------------------------------------------------------  «»
  97. »« | it can also be used to handle "non-conforming" Last Names |  »«
  98. «» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»
  99. »« |                     "VON NUEMANN" --> "VonNuemann"        |  »«
  100. «» -------------------------------------------------------------  «»
  101. »« BUT: you must add the additional tests yourself (it's easy!)   »«
  102. «»                                                                «»
  103. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  104. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  105. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  106.  |-----------------------------------------------------------------|
  107.  |                                                                 |
  108.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  109.  |                                            e.g. Phone #         |
  110.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  111.  |                                            e.g. Address         |
  112.   -----------------------------------------------------------------
  113.  
  114.  * Running 'rx Scion2html.rexx' for further directions
  115.  
  116.  * 'rx Scion2html.rexx Normal' automagically creates a .htm file
  117.  * for each person in your ScionGenealogist data base;
  118.  * following the TEMPLATE:
  119.  
  120. ############# begin genealogytemplate.html #########################
  121. <HTML>
  122. <TITLE>Person Data Sheet</TITLE>
  123. <A href="P#A.htm"><img src="P#.gif"></A>
  124. <H2>Person (<A HREF="P#I.htm"><I>more info</I></A>) 
  125.  (<A href="P#A.htm"><B>Picture Album</B></A>)
  126.  (<A href="Genealogy/GENEAFIL.htm"><B>List of Persons.</B></A>)
  127. </H2>
  128. <H3>
  129. Born: birthdate * birthplace <BR>
  130. Died: deathdate + deathplace . Buried: burialplace <BR>
  131. </H3>
  132. <HR>
  133. <H2>List of Persons in data base.</H2><P>
  134. <A HREF="P#.htm"><B>malePerson</B></A> * birthdate + deathdate <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A><BR>
  135. <A HREF="P#.htm"><I>femalePerson</I></A> * birthdate + deathdate <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A><BR>
  136. <HR>
  137. <H3>Immediate Family of <I>Person</I></H3>
  138. <PRE><TT>
  139.   <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A> & mdate @ mplace
  140.   |            <A HREF="Family#I.htm"><I>family info</i></A>
  141.   |_____ <A HREF="sibling1.htm">sibling1</A> * sibling1birthdate + sibling1deathdate
  142.   |_____ <A HREF="siblingN.htm">siblingN</A> * siblingNbirthdate + siblingNdeathdate
  143.   |             
  144.   <b>Person</b>_//\_<A HREF="Spouse1.htm">Spouse1</A> & m1date @ m1place
  145.   |  |  |            <A HREF="Family#I.htm"><I>family info</i></A>
  146.   |  |  |_____ <A HREF="m1child1.htm">m1child1</A> * m1child1birthdate + m1child1birthdate
  147.   |  |  |_____ <A HREF="m1childN.htm">m1childN</A> * m1childNbirthdate + m1childNbirthdate
  148.   |  |
  149.   |  |_//\_<A HREF="Spouse2.htm">Spouse2</A> & m2date @ m2place
  150.   |    |            <A HREF="Family#I.htm"><I>family info</i></A>
  151.   |    |_____ <A HREF="m2child1.htm">m2child1</A> * m2child1birthdate + m2child1birthdate
  152.   |    |_____ <A HREF="m2childN.htm">m2childN</A> * m2childNbirthdate + m2child2birthdate
  153.   |
  154.   |_//\_<A HREF="Spousen.htm">Spousen</A> & mNdate @ mNplace
  155.     |            <A HREF="Family#I.htm"><I>family info</i></A>
  156.     |_____ <A HREF="mNchild1.htm">mNchild1</A> * mNchild1birthdate + mNchild1birthdate
  157.     |_____ <A HREF="mNchildN.htm">mNchildN</A> * mNchildNbirthdate + mNchildNbirthdate
  158. </TT><PRE>
  159. <HR>
  160. <H3>Ancestors of <I>Person</I></H3>
  161. <TT>
  162.           - <A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (FFF) * birthdate + deathdate
  163.       - <A HREF="GrandFather.htm"><B>GrandFather</B></A> (FF) * birthdate + deathdate
  164.           - <A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (FFM) * birthdate + deathdate
  165.   - <A HREF="Father.htm"><B>Father</B></A> (F) * birthdate + deathdate
  166.           - <A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (FMF) * birthdate + deathdate
  167.       - <A HREF="GrandMother.htm"><I>GrandMother</I></A> (FM) * birthdate + deathdate
  168.           - <A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (FMM) * birthdate + deathdate
  169. Person * birthdate + deathdate
  170.           - <A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (MFF) * birthdate + deathdate
  171.       - <A HREF="GrandFather.htm"><B>GrandFather</B></A> (MF) * birthdate + deathdate
  172.           - <A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (MFM) * birthdate + deathdate
  173.   - <A HREF="Mother.htm"><I>Mother</I></A> (M) * birthdate + deathdate
  174.           - <A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (MMF) * birthdate + deathdate
  175.       - <A HREF="GrandMother.htm"><I>GrandMother</I></A> (MM) * birthdate + deathdate
  176.           - <A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (MMM) * birthdate + deathdate
  177. </TT></PRE>
  178. <HR>
  179. <H3>
  180. <PRE><TT>
  181.      a template to represent Genealogy data in HTML hypertext.
  182.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA
  183.      e.g. search-replace-all Person with: My Name
  184.      e.g. query-search-replace Mother with: My Mother's Name
  185.  * judiciously edit .htm file names in anchors
  186.  * add/remove lines for children, siblings, spouses as necessary
  187. <BR>
  188. bugs: I'm assuming more than 8 char file names (works in UNIX & my Amiga)
  189. </TT></PRE>
  190. </H3>
  191. </HTML>
  192. ############### end genealogytemplate.html #####################################
  193.  
  194.  * In an HTML file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  195.  
  196. <A href="file://localhost/Genea:DBNAMEG/GENEAFIL.htm">
  197. Genealogy</A>
  198.  
  199. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  200. ^^ assumes you ran 'rx Scion2html.rexx Normal' in directory: Doc:HTMLGenea ^^
  201. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  202.  
  203.  *   You might also create an {MyGenealogy}.htm file yourself in directory
  204.  *   Genea:DBNAMEG as a starting point, with the anchor of
  205.  
  206. <A href="file://localhost/Genea:DBNAMEG/MyGENEAFIL.htm">My Genealogy</A>
  207.  
  208.  e.g.:
  209. _____________________________________________________________
  210.  
  211. <TITLE>FirstName LastName Genealogy </TITLE>
  212. <H1>FirstName LastName Genealogy</H1>
  213. <HR>
  214. <A HREF="GENEAFIL.htm">(List of persons).</A><P>
  215.  
  216. This is the genealogy of <A href="P1.htm">FirstName LastName</A>.
  217. _____________________________________________________________
  218.          ^^^^^^^^^^^^^^
  219.  * Note the convention of first 2 characters from FirstName
  220.  *                        first 4 characters from LastName
  221.  *                        & BirthDate (with all blanks removed)
  222.  *
  223.  * If the BirthDate is not entered, the convention is:
  224.  *                        first 2 characters from FirstName
  225.  *                        first 6 characters from LastName
  226.  *                        & ScionGenealogist IRN
  227.  *
  228.  
  229.  * The PN{IRN}.DBNAME files are used to generate the "more info" files.
  230.  
  231.  * PP & FP Notes: (personal & family pictures; picture albums)
  232.  * ScionGenealogist names pictures as;
  233.  *      PP{IRN}.DBNAME (personal) and FP{mFGRN}.DBNAME (family)
  234.  * {P|F}P{IRN|mFGRN}.DBNAME now used as pictures & links.
  235.  *    GfxCon is used to copy/reduce jpegs from {P|F}P{IRN|mFGRN}.DBNAME
  236.  *    reductions are anchors pointing to html's for pictures albums
  237.  *    reductions in pictures albums are anchors pointing to pictures
  238.  *  picture albums will not be overwritten; they may be updated with
  239.  *    additional pictures; links to other pictures, etc.
  240.  * Whenever {P|F}P{IRN|mFGRN}.DBNAME is changed or replaced,
  241.  *  the corresponding jpegs will be updated
  242.  * {P|F}P{IRN|mFGRN}.DBNAMEA may be any legal GfxCon input picture FORMAT
  243.  * (ILBM,RGB8,PCX,BMP,RLE8,TIFF,Targa,LBM,RGBN,IMG,RLE4,GIF,JPEG,RGB-Raw)
  244.  
  245.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  246.  * "more info" file will be updated if 'rx Scion2html.rexx {IRN}' is re-run.
  247.  
  248. */
  249.  
  250. /* add libraries */
  251.         libs = 'rexxsupport.library rexxarplib.library'
  252.         DO i = 1 TO Words(libs)
  253.                 lib = Word(libs,i)
  254.                 IF ~Show('Lib',lib) THEN DO
  255.                         IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  256.                         ELSE DO
  257.                                 'message "===> cannot find' lib 'in LIBS:"'
  258.                                 EXIT 10
  259.                         END
  260.                 END
  261.         END i
  262.  
  263. SAY ' '
  264. SAY '                     Scion2html.rexx © Harold H. Ipolyi'
  265. SAY ' '
  266.  
  267. DoPictures = EXISTS("Sys:Tools/GfxCon")
  268.  
  269. IF ~DoPictures THEN DO
  270.     SAY ' '
  271.     say 'GfxCon not found in Sys:Tools - unable to include pictures'
  272.     END
  273.  
  274. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  275. options RESULTS
  276.  
  277. IF Show(p,'SCIONGEN') THEN DO
  278.     'GETDBNAME'        /* Issue GET DB NAME command to Scion Genealogist */
  279.     DBNAME = RESULT
  280.     END
  281.  
  282. PARSE ARG target
  283. target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes    */
  284.  
  285. DO WHILE target = '' | target = '?' | target = 'INFO' | target = 'HELP'
  286.     SAY ' '
  287.     SAY '    please send comments, questions to:'
  288.     SAY ' '
  289.     SAY '        ipolyi@pat.mdc.com'
  290.     SAY '            or:'
  291.     SAY '        Harold H. Ipolyi '
  292.     SAY '         P.O.Box 891206 '
  293.     SAY '         Houston, Tx 77289-1206 '
  294.     SAY '  _________________________________________________________'
  295.     SAY ' /                                                         \'
  296.     SAY '  [re]create html hypertext from ScionGenealogist data base '
  297.     SAY ' \_________________________________________________________/'
  298.     SAY ' '
  299.     SAY ' Usage: start ScionGenealogist, load a genealogy database;'
  300.     SAY ' '
  301.     SAY '        start a Shell;'
  302.     SAY ' '
  303.     SAY '        cd to a target directory; and execute:'
  304.     SAY ' '
  305.     SAY '                i.e. wherein directory of html''s will/does exist'
  306.     SAY ' '
  307.     SAY '           rx Scion2html.rexx Normal  -> recreates all .htm files'
  308.     SAY '                   or:'
  309.     SAY '           rx Scion2html.rexx IRN     -> specific P{IRN}.htm file'
  310.     SAY ' '
  311.     IF DBNAME = "DBNAME" THEN EXIT
  312. /*    EXIT
  313.     END
  314. */
  315.     SAY ' Enter "Normal" to recreate all P#.htm files; or'
  316.     SAY ' '
  317.     SAY ' a 'DBNAME' Scion data base "IRN" to recreate a specific P{IRN}.htm file.'
  318.     SAY ' '
  319.     PULL target
  320.  
  321. target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes    */
  322. END
  323.  
  324. IF target = '' | target = 'Q' | target = 'EXIT' | target = 'QUIT' THEN
  325.     EXIT
  326.  
  327. IF ~Show(p,'SCIONGEN') THEN DO
  328.     SAY ' '
  329.     SAY '    Cannot proceed because ScionGenealogist is NOT currently running:'
  330.     SAY ' '
  331.     SAY '    1. Please start ScionGenealogist and'
  332.     SAY ' '
  333.     SAY '    2. load the desired data base. Then:'
  334.     SAY ' '
  335.     SAY '    3. rx Scion2html.rexx Normal  OR  rx Scion2html.rexx IRN'
  336.     SAY ' '
  337.     EXIT
  338.     END
  339.  
  340. IF target = 'N' THEN
  341.     target = 'NORMAL'
  342. IF target = 'T' THEN
  343.     target = 'TEST'
  344.  
  345. /*    SAY target    */
  346.  
  347. 'GETPROGVERSION'
  348. VERSION = RESULT
  349.  
  350. IF VERSION < 3.13 THEN DO
  351.     SAY ' '
  352.     say ' Requires VERSION = 3.13 or greater'
  353.     SAY ' '
  354.     EXIT
  355.     END
  356.             /* ??? GETDBDIRPATH ??? of Scion data base */
  357.  
  358. SAY ' '
  359. Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
  360. SAY ' '
  361.  
  362. PRAGMA('w','n')
  363. IF ~Exists("Genealogy:"DBNAME) THEN DO
  364.     SAY '     Genealogy:'DBNAME' not found,'
  365.     SAY ' '
  366.     SAY "     Please create an assign to data base "DBNAME"'s directory:"
  367.     SAY ' '
  368.     SAY ' assign Genealogy: {Volume:Directory}'
  369.     SAY ' '
  370.     EXIT
  371.     END
  372. PRAGMA('w','w')
  373.  
  374. Gdir = DBNAME'G'
  375. Tdir = DBNAME'T'
  376.  
  377. IF ~Makedir(Gdir) THEN DO
  378.     SAY ' '
  379.     SAY ' ===> unable to create directory: 'Gdir
  380.     SAY ' '
  381.     EXIT
  382.     END
  383.  
  384. IF ~Makedir(Tdir) THEN DO
  385.     SAY ' '
  386.     SAY ' ===> unable to create directory: 'Tdir
  387.     SAY ' '
  388.     EXIT
  389.     END
  390.  
  391.  
  392. 'GETTOTALIRN'        /* Issue command to Scion Genealogist */
  393.     TOTALIRN = RESULT
  394.  
  395. Say "Number of people in database " DBNAME " = " TOTALIRN
  396. SAY ' '
  397.  
  398. 'GETPERSLABEL' 1
  399. PERSLABEL1 = RESULT
  400. 'GETPERSLABEL' 2
  401. PERSLABEL2 = RESULT
  402. 'GETPERSLABEL' 3
  403. PERSLABEL3 = RESULT
  404. 'GETFAMLABEL' 1
  405. FAMLABEL1 = RESULT
  406. 'GETFAMLABEL' 2
  407. FAMLABEL2 = RESULT
  408. IF IsNumeric(target) THEN
  409.     DO
  410.     Say 'Processing person ' target ' of ' TOTALIRN ' in database ' DBNAME
  411.  
  412.     IF target <= TOTALIRN THEN DO
  413. /*        Open('GenealogyText' @,Tdir'/GenealogyOf'target,'w')    */
  414.         Open('GenealogyText',Tdir'/G'target,'w')
  415.         CALL MakeOne(target,0)
  416.         Close('GenealogyText')
  417.         END
  418.     END
  419. ELSE
  420.     DO
  421.     target = Upper(target)
  422.     IF target = "TEST" THEN DO
  423.  
  424.         DO i = 1 TO 7
  425. /*        Open('GenealogyText',Tdir'/GenealogyOf'i,'w')    */
  426.         Open('GenealogyText',Tdir'/G'i,'w')
  427.         CALL MakeOne(i,0)
  428.         Close('GenealogyText')
  429.             END
  430.         END
  431.     ELSE
  432.         DO
  433.         Say "Processing all " TOTALIRN " persons in database " DBNAME
  434.  
  435. /* GENEAFIL.htm is a Scion data base IRN order list of all persons in 
  436.    html format:
  437.  
  438.    person * birthdate + deathdate (()) father //\ mother    */
  439.  
  440. Say 'file name: 'Gdir'/GENEAFIL.htm for: List of Persons.'
  441.  
  442.         Open('GenealogyFile',Gdir'/GENEAFIL.htm','w')
  443.         WriteLn('GenealogyFile','<HTML>')
  444.         WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  445. WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  446.         WriteLn('GenealogyFile','<H3>')
  447.  
  448.         Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  449.         WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  450.         WriteLn('GenealogyText','')
  451.         WriteLn('GenealogyText','-----------------------------------------------------------')
  452.         WriteLn('GenealogyText','')
  453.  
  454.         DO i = 1 TO TOTALIRN
  455.             CALL MakeOne(i,1)
  456.             END
  457.         WriteLn('GenealogyFile','</H3>')
  458.         WriteLn('GenealogyFile','<HR>')
  459.         WriteLn('GenealogyFile','<Address>')
  460.         'GETPROGVERSION'
  461.         VERSION = RESULT
  462.         WriteCh('GenealogyFile','<H3>ScionGenealogist')
  463.         IF VERSION > 0 THEN WriteCh('GenealogyFile',' V 'VERSION)
  464.         WriteLn('GenealogyFile',' © Robbie J Akins; ')
  465.         WriteLn('GenealogyFile','Scion'VERSION'2html.rexx © Harold Ipolyi</H3>')
  466.         WriteLn('GenealogyFile','</Address>')
  467.         WriteLn('GenealogyFile','</HTML>')
  468.         END
  469. Say ' '
  470. ThisPath = PRAGMA('d')
  471. IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
  472. Say ' ---------------------------------------------------------------------'
  473. Say ' If you have not already done so, add the following anchor pointing to'
  474. Say ' "'GetLastName(DBNAME)' Genealogy" to a html file (maybe HOME PAGE):  '
  475. Say ' ---------------------------------------------------------------------'
  476. Say ' <A href="/'ThisPath||Gdir'/GENEAFIL.htm">'GetLastName(DBNAME)' Genealogy</A>'
  477. Say ' ---------------------------------------------------------------------'
  478. Say ' and maybe: <A href="/'ThisPath||Gdir'/P1.htm">my Genealogy</A>'
  479. Say ' ---------------------------------------------------------------------'
  480.     END
  481. SAY ' '
  482. Say 'Scion2html.rexx completed normally'
  483. EXIT
  484.  
  485. /*************************************************************************/
  486.  
  487. MakeOne: PROCEDURE EXPOSE target DBNAME Gdir Tdir DoPictures FAMLABEL1 FAMLABEL2 PERSLABEL1 PERSLABEL2 PERSLABEL3
  488.     PARSE ARG ScionIRN, EndOfFile
  489. 'EXISTPERSON' ScionIRN
  490. /**/
  491. if RESULT = 'YES' THEN DO
  492. /**/
  493.     HasFileFATHER = 0
  494.     HasFileMOTHER = 0
  495.     HasMOTHER = 0
  496.     HasFATHER = 0
  497.     HasPARENTS = 0
  498.     HasCHILDREN = 0
  499.     DoGenText = 0
  500.     'GETPARENTS' ScionIRN
  501.     PARENTS = RESULT
  502.         tPARENTSt = 't'PARENTS't'
  503. /*    Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ???    */
  504.     IF tPARENTSt ~= 'tt' THEN HasPARENTS = 1
  505.     'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  506.     MARRIAGE = RESULT
  507.     tMARRIAGESt = 't'MARRIAGE't'
  508. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  509.     IF tMARRIAGESt ~= 'tMARRIAGEt' THEN DO
  510.         mFGRN = MARRIAGE
  511.         'GETCHILD' mFGRN 0    /*    ??? GETTOTCHILDREN FGRN ???    */
  512.         'EXISTPERSON' RESULT
  513.         if RESULT = 'YES' then HasCHILDREN = 1        
  514.     END
  515. /*
  516. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  517. */
  518.     IF ( HasPARENTS + HasCHILDREN ) = 1 THEN DoGenText = 1
  519. /**/
  520.     'GETLASTNAME' ScionIRN
  521.     LASTNAME = GetLastName(RESULT)
  522.     'GETFIRSTNAME' ScionIRN
  523.     FIRSTNAME = RESULT
  524.     'GETSEX' ScionIRN
  525.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  526.     thelastname = LASTNAME
  527.     thegender = GENDER
  528.     FULLNAME = GetFullName(FIRSTNAME)
  529.     MFULLNAME = MGetFullName(FIRSTNAME)
  530.     PFULLNAME = PGetFullName(FIRSTNAME)
  531.     'GETBIRTHDATE' ScionIRN
  532.     BIRTHDATE = RESULT
  533.     'GETBIRTHPLACE' ScionIRN
  534.     BIRTHPLACE = RESULT
  535.     'GETDEATHDATE' ScionIRN
  536.     DEATHDATE = RESULT
  537.     'GETDEATHPLACE' ScionIRN
  538.     DEATHPLACE = RESULT
  539.     'GETBURIALPLACE' ScionIRN
  540.     BURIALPLACE = RESULT
  541.     'GETPERSUSER1' ScionIRN
  542.     PERSUSER1 = CheckForReplacement(RESULT)
  543.     PERSUSERn1 = CheckForNAReplacement(RESULT)
  544.     'GETPERSUSER2' ScionIRN
  545.     PERSUSER2 = CheckForReplacement(RESULT)
  546.     PERSUSERn2 = CheckForNAReplacement(RESULT)
  547.     'GETPERSUSER3' ScionIRN
  548.     PERSUSER3 = CheckForReplacement(RESULT)
  549.     PERSUSERn3 = CheckForNAReplacement(RESULT)
  550. IF target ~= "NORMAL" | BIRTHPLACE ~= "" | DEATHPLACE ~= "" | BURIALPLACE ~= "" | PERSUSER1 ~= "" | PERSUSER2 ~= "" | PERSUSER3 ~= "" THEN DoGenText = 1
  551. /**/
  552.     IF LASTNAME = "" THEN DO
  553. Say "Person " ScionIRN"'s last name is not defined; no new html file being created!"
  554.         RETURN
  555.         END
  556. /*    Say "Person "'P'ScionIRN    */
  557.     PfilN = 'P'ScionIRN
  558. /**/
  559.     dPfilN = Gdir'/'PfilN
  560.     Say ''
  561.     Say 'html: 'dPfilN'.htm for: 'FULLNAME' {'ScionIRN'}'
  562.     Open('PERSONFILE',dPfilN'.htm','w')
  563.     WriteLn('PERSONFILE','<HTML>')
  564.     WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  565. /**/
  566.     IF Exists('Genealogy:PP'ScionIRN'.'DBNAME) & DoPictures THEN DO
  567. /**/
  568.         IF Exists(dPfilN'.jpg') THEN DO
  569. Parse value StateF(dPfilN'.jpg') with type size blk bits PJday PJmin PJtick com
  570. Parse value StateF('Genealogy:PP'ScionIRN'.'DBNAME) with type size blk bits PPday PPmin PPtick com
  571. Say 'Genealogy:PP'ScionIRN'.'DBNAME PPday PPmin PPtick  dPfilN'.jpg' PJday PJmin PJtick
  572.             IF ( PPday > PJday ) | ( PPday = PJday & PPmin > PJmin ) THEN DO
  573.                 Delete(dPfilN'.jpg')
  574.                 Delete(dPfilN'.gif')
  575. Say 'Scion file Genealogy:PP'ScionIRN'.'DBNAME 'newer; replacing 'dPfilN'.jpg'
  576.                 END
  577.             END
  578. /**/
  579.         WriteCh('PERSONFILE','<A HREF="'PfilN'A.htm')
  580.         WriteLn('PERSONFILE','"><img src="'PfilN'.gif"></A>')
  581.         END
  582. /**/
  583.     WriteCh('PERSONFILE','<H2>'MFULLNAME)
  584. /**/
  585.     IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  586.         Say 'Writing info file 'dPfilN'I.htm'
  587.         Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
  588.         Open('PERSONI',dPfilN'I.htm','w')
  589.         WriteLn('PERSONI','<HTML>')
  590.         WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  591.         WriteCh('PERSONI','<A HREF="'PfilN'.htm">'MFULLNAME)
  592.         WriteCh('PERSONI','</A> Information. (<A HREF="GENEAFIL.htm">')
  593.         WriteLn('PERSONI','<B>List of persons.</B></A>)</H2><PRE><TT>')
  594.         IF DoGenText THEN WriteLn('GenealogyText',PFULLNAME' Information.')
  595.         DO While ~EOF('PNDBNAME')
  596.             line = ReadLn('PNDBNAME')
  597.             WriteLn('PERSONI',CheckForReplacement(line))
  598.             IF DoGenText THEN WriteLn('GenealogyText',CheckForNAReplacement(line))
  599.             END
  600.         Close('PNDBNAME')
  601.         IF DoGenText THEN WriteLn('GenealogyText',' ')
  602.         WriteLn('PERSONI','</HTML>')
  603.         Close('PERSONI')
  604. WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"><B>more info</B></A>)')
  605.         END
  606. /**/
  607.     IF Exists('Genealogy:PP'ScionIRN'.'DBNAME) & DoPictures THEN DO
  608. /**/
  609.  
  610.         IF Exists(dPfilN'.jpg') THEN DO
  611.             Say 'Leaving picture 'dPfilN'.jpg unmodified'
  612.             END
  613.         ELSE DO
  614.             Say 'Creating picture 'dPfilN'.jpg'
  615. /*
  616. Say 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  617. */
  618. address command 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  619.             END
  620.         IF Exists(dPfilN'.gif') THEN DO
  621.             Say 'Leaving image 'dPfilN'.gif unmodified'
  622.             END
  623.         ELSE DO
  624.             Say 'Creating image 'dPfilN'.gif'
  625. /*
  626. Say 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.gif FORMAT GIF BOXFIT 120 120'
  627. */
  628. address command 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.gif FORMAT GIF BOXFIT 120 120'
  629.             END                   
  630. WriteCh('PERSONFILE',' (<A HREF="'PfilN'A.htm"><B>Picture Album</B></A>)')
  631.         IF Exists(dPfilN'A.htm') THEN DO
  632.             Say 'Leaving picture album 'dPfilN'A.htm unmodified'
  633.             END
  634.         ELSE DO
  635.             Say 'Creating picture album 'dPfilN'A.htm'
  636.             Open('PERSONP',dPfilN'A.htm','w')
  637.             WriteLn('PERSONP','<HTML>')
  638.             WriteLn('PERSONP','<TITLE>'FULLNAME' Picture Album</TITLE>')
  639.             WriteCh('PERSONP',MFULLNAME' . ')
  640.             WriteCh('PERSONP','<A HREF="'PfilN'.jpg">')
  641.             WriteLn('PERSONP','<img src="'PfilN'.gif"></A>')
  642.             WriteLn('PERSONP',' . <B>Picture Album</B><HR>')
  643. WriteCH('PERSONP','<H3>another JPEG picture <A HREF="'PfilN'a1.jpg"><img src="')
  644. WriteLn('PERSONP',PfilN'a1.gif"></A> anchored by image')
  645. WriteLn('PERSONP',' created by:<P>GfxCon 'dPfilN'a1.jpg TO 'dPfilN'a1.gif FORMAT ')
  646. WriteLn('PERSONP','JPEG QUALITY 33 BOXFIT 120 120<HR>')
  647. WriteLn('PERSONP','Edit 'dPfilN'A.htm to add more pictures to the Picture Album<P>')
  648. WriteCH('PERSONP','<B>CAUTION</B>: deleting Directory: 'Gdir' destroys all Picture ')
  649. WriteLn('PERSONP',' Album modifications. YOUR WORK WILL BE LOST!</H3>')
  650.             WriteLn('PERSONP','</HTML>')
  651.             Close('PERSONP')
  652.             END
  653.         END
  654. /**/
  655.     WriteLn('PERSONFILE',' (<A HREF="GENEAFIL.htm"><B>List of persons.
  656. </B></A>)')
  657.     WriteLn('PERSONFILE','<PRE><TT>')
  658.     IF DoGenText THEN DO
  659. /*        IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/GenealogyOf'ScionIRN' for 'FULLNAME' {'ScionIRN'}'    */
  660.         IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/G'ScionIRN' for 'FULLNAME' {'ScionIRN'}'
  661.         WriteLn('GenealogyText','')
  662.         WriteLn('GenealogyText','-----------------------------------------------------------')
  663.         WriteLn('GenealogyText','')
  664.         WriteLn('GenealogyText',PFULLNAME' Data Sheet')
  665.         END
  666.     IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
  667.         WriteCh('PERSONFILE','Born: ')
  668.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
  669.         IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHPLACE)
  670.         WriteLn('PERSONFILE','')
  671.         IF BIRTHDATE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText','Born: 'BIRTHDATE)
  672.         IF BIRTHPLACE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText',' * 'BIRTHPLACE)
  673.         IF DoGenText THEN WriteLn('GenealogyText','')
  674.         END
  675.     IF DEATHDATE ~= "" THEN    DO
  676.         WriteCh('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
  677.         IF DoGenText THEN WriteCh('GenealogyText','Died: 'DEATHDATE' + 'DEATHPLACE)
  678.         IF BURIALPLACE ~= "" THEN DO
  679.             WriteCh('PERSONFILE',' . Buried: 'BURIALPLACE)
  680.             IF DoGenText THEN WriteCh('GenealogyText',' . Buried: 'BURIALPLACE)
  681.             END
  682.         WriteLn('PERSONFILE','')
  683.         IF DoGenText THEN WriteLn('GenealogyText','')
  684.         END
  685.     ELSE DO
  686.         IF DEATHPLACE ~= "" THEN DO
  687.             WriteLn('PERSONFILE',DEATHPLACE)
  688.             IF DoGenText THEN WriteLn('GenealogyText',DEATHPLACE)
  689.             END
  690.         IF BURIALPLACE ~= "" THEN DO
  691.             WriteLn('PERSONFILE',BURIALPLACE)
  692.             IF DoGenText THEN WriteLn('GenealogyText',BURIALPLACE)
  693.             END
  694.         END
  695.     IF PERSUSER1 ~= "" THEN DO
  696.         WriteLn('PERSONFILE',PERSLABEL1': 'PERSUSER1)
  697.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL1': 'PERSUSERn1)
  698.         END
  699.     IF PERSUSER2 ~= "" THEN DO
  700.         WriteLn('PERSONFILE',PERSLABEL2': 'PERSUSER2)
  701.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL2': 'PERSUSERn2)
  702.         END
  703.     IF PERSUSER3 ~= "" THEN DO
  704.         WriteLn('PERSONFILE',PERSLABEL3': 'PERSUSER3)
  705.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL3': 'PERSUSERn3)
  706.         END
  707.  
  708. /* end of personal data; start family tree segment */
  709.  
  710. /*    WriteLn('PERSONFILE','<PRE><TT>')    */
  711.     WriteLn('PERSONFILE','<HR>')
  712.     IF DoGenText THEN DO
  713.         WriteLn('GenealogyText','')
  714.         WriteLn('GenealogyText','-----------------------------------------------------------')
  715.         WriteLn('GenealogyText','')
  716.         END
  717.     WriteLn('PERSONFILE','<LI>Immediate Family of 'MFULLNAME)
  718.     IF DoGenText THEN DO
  719.         WriteLn('GenealogyText','Immediate Family of 'PFULLNAME)
  720.         WriteLn('GenealogyText','')
  721.         END
  722. /**/
  723.     IF HasPARENTS THEN DO
  724.         'GETPRINCIPAL' PARENTS
  725.         PRINCIPAL = RESULT
  726.         'GETSPOUSE' PARENTS
  727.         SPOUSE = RESULT
  728.         'GETMARRYDATE' PARENTS
  729.         PARENTSMARRIAGEDATE = RESULT
  730.         'GETMARRYPLACE' PARENTS
  731.         PARENTSmFGRNPLACE = RESULT
  732.         'GETFAMUSER1' PARENTS
  733.         PARENTSmFGRNCELEBRANT = CheckForReplacement(RESULT)
  734.         PARENTSnmFGRNCELEBRANT = CheckForNAReplacement(RESULT)
  735.         'GETFAMUSER2' PARENTS
  736.         PARENTSmFGRNCOMMENT = CheckForReplacement(RESULT)
  737.         PARENTSnmFGRNCOMMENT = CheckForNAReplacement(RESULT)
  738.         'GETSEX' PRINCIPAL
  739.         IF RESULT = 'M' THEN
  740.             DO
  741.             FATHERScionIRN = PRINCIPAL
  742.             MOTHERScionIRN = SPOUSE
  743.             END
  744.         ELSE
  745.             DO
  746.             FATHERScionIRN = SPOUSE
  747.             MOTHERScionIRN = PRINCIPAL
  748.             END
  749.         'GETLASTNAME' FATHERScionIRN
  750.         FATHERLASTNAME = GetLastName(RESULT)
  751.         'GETFIRSTNAME' FATHERScionIRN
  752.         FATHERFIRSTNAME = RESULT
  753.         IF FATHERFIRSTNAME ~= "" | FATHERLASTNAME ~= "" THEN HasFATHER = 1
  754.         thelastname = FATHERLASTNAME
  755.         thegender = "m"
  756. FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
  757. MFATHERFULLNAME = MGetFullName(FATHERFIRSTNAME)
  758. PFATHERFULLNAME = PGetFullName(FATHERFIRSTNAME)
  759.         'GETBIRTHDATE' FATHERScionIRN
  760.         FATHERBIRTHDATE = RESULT
  761.         'GETLASTNAME' MOTHERScionIRN
  762.         MOTHERLASTNAME = GetLastName(RESULT)
  763.         'GETFIRSTNAME' MOTHERScionIRN
  764.         MOTHERFIRSTNAME = RESULT
  765.         IF MOTHERFIRSTNAME ~= "" | MOTHERLASTNAME ~= "" THEN HasMOTHER = 1
  766.         thelastname = MOTHERLASTNAME
  767.         thegender = "f"
  768. MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
  769. MMOTHERFULLNAME = MGetFullName(MOTHERFIRSTNAME)
  770. PMOTHERFULLNAME = PGetFullName(MOTHERFIRSTNAME)
  771.         'GETBIRTHDATE' MOTHERScionIRN
  772.         MOTHERBIRTHDATE = RESULT
  773. /**/
  774.         IF FATHERLASTNAME ~= "" THEN DO
  775.             HasFileFATHER = 1
  776.             FATHERFILENAME = 'P'FATHERScionIRN
  777.             END        
  778. /**/
  779.         IF MOTHERLASTNAME ~= "" THEN DO
  780.             HasFileMOTHER = 1
  781.             MOTHERFILENAME = 'P'MOTHERScionIRN
  782.             END        
  783. /**/
  784.         WriteCh('PERSONFILE','  ')
  785.         IF HasFileFATHER THEN WriteCh('PERSONFILE','<A HREF="'FATHERFILENAME'.htm">')
  786.         WriteCh('PERSONFILE',MFATHERFULLNAME)
  787.         IF HasFileFATHER THEN WriteCh('PERSONFILE','</A> //\ ')
  788.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','<A HREF="'MOTHERFILENAME'.htm">')
  789.         WriteCh('PERSONFILE',MMOTHERFULLNAME)
  790.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','</A>')
  791. /**/
  792.         IF PARENTSMARRIAGEDATE ~= "" THEN
  793. WriteCh('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
  794.         IF PARENTSmFGRNPLACE ~= "" THEN
  795. WriteCh('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
  796. /**/
  797.         WriteLn('PERSONFILE','')
  798.         IF DoGenText THEN DO
  799.             WriteCh('GenealogyText','  'PFATHERFULLNAME' //\ 'PMOTHERFULLNAME)
  800.     IF PARENTSMARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'PARENTSMARRIAGEDATE)
  801.     IF PARENTSmFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'PARENTSmFGRNPLACE)
  802.             WriteLn('GenealogyText','')
  803.             END
  804.         spcs = '  |'
  805.         DO i = 0 TO Length(FATHERFULLNAME)
  806.             spcs = spcs' '        /*    ??? GETFAMLBL1 ???    */
  807.         END                /*    ??? GETFAMLBL2 ???    */
  808. /**/
  809.     FfilN = Gdir'/F'PARENTS
  810.     IF Exists(FfilN'I.htm') THEN DO
  811.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  812. Parse value StateF(FfilN'I.htm') with type size blk bits PFday PFmin PFtick com
  813. Parse value StateF('Genealogy:FN'PARENTS'.'DBNAME) with type size blk bits PNday PNmin PNtick com
  814. /* Say PfilN'I.htm' PFday PFmin PFtick  'Genealogy:FN'PARENTS'.'DBNAME PNday PNmin PNtick */
  815.             IF ( PNday > PFday ) | ( PNday = PFday & PNmin > PFmin ) THEN DO
  816.                 Delete(FfilN'I.htm')
  817. Say 'Scion file Genealogy:FN'PARENTS'.'DBNAME 'newer; replacing 'FfilN'I.htm'
  818.                 END
  819.             END
  820.         END
  821. /**/
  822.         Minfo = 0
  823.     IF Exists(FfilN'I.htm') THEN
  824.         Minfo = 1
  825. /*    WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"><B>more info</B></A>)')    */
  826.     ELSE DO
  827.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  828.             Minfo = 1
  829.             Say 'Writing info file'FfilN'I.htm'
  830.             Open('FNDBNAME','Genealogy:FN'PARENTS'.'DBNAME,'r')
  831.             Open('FAMILYI',FfilN'I.htm','w')
  832.     WriteLn('FAMILYI','<HTML>')
  833.     WriteLn('FAMILYI','<TITLE>'FATHERFULLNAME' Family Information</TITLE>')
  834.     WriteCh('FAMILYI','<H2>(<A HREF="GENEAFIL.htm">')
  835.     WriteLn('FAMILYI','<B>List of persons.</B></A>)</H2><PRE><TT>')
  836.             DO While ~EOF('FNDBNAME')
  837.                 line = ReadLn('FNDBNAME')
  838.                 WriteLn('FAMILYI',line)
  839.             END
  840.             Close('FNDBNAME')
  841.             WriteLn('FAMILYI','</HTML>')
  842.             Close('FAMILYI')
  843. /*    WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"><B>more info</B></A>)')    */
  844.             END
  845.         END
  846. /**/
  847.     IF PARENTSmFGRNCELEBRANT ~= '' | Minfo THEN DO
  848.         WriteCh('PERSONFILE',spcs)
  849.         IF Minfo THEN
  850.             WriteCh('PERSONFILE','(<A HREF="F'PARENTS'I.htm"><B>family info</B></A>) ')
  851.         IF PARENTSmFGRNCELEBRANT ~= '' THEN DO
  852.             WriteCh('PERSONFILE',FAMLABEL1': 'PARENTSmFGRNCELEBRANT)
  853.             IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'PARENTSnmFGRNCELEBRANT)
  854.             END
  855.         WriteLn('PERSONFILE','')
  856.         END
  857. IF PARENTSmFGRNCOMMENT ~= '' THEN DO
  858.     WriteLn('PERSONFILE',spcs' 'FAMLABEL2': 'PARENTSmFGRNCOMMENT)
  859.     IF DoGenText THEN WriteLn('GenealogyText',spcs' 'FAMLABEL2': 'PARENTSnmFGRNCOMMENT)
  860.         END
  861.         DO i = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  862.             'GETCHILD' PARENTS i
  863.             PARENTSc = RESULT
  864.             'GETFIRSTNAME' PARENTSc
  865.             PARENTScFIRSTNAME = RESULT
  866. /**/
  867.             IF PARENTScFIRSTNAME ~= "" THEN DO
  868.                 IF PARENTSc ~= ScionIRN THEN DO
  869.                     'GETLASTNAME' PARENTSc
  870.                     PARENTScLASTNAME = GetLastName(RESULT)
  871.                     'GETFIRSTNAME' PARENTSc
  872.                     PARENTScFIRSTNAME = RESULT
  873.                     'GETSEX' PARENTSc
  874. PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  875.                     thelastname = PARENTScLASTNAME
  876.                     thegender = PARENTScGENDER
  877. PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
  878. MPARENTScFULLNAME = MGetFullName(PARENTScFIRSTNAME)
  879. PPARENTScFULLNAME = PGetFullName(PARENTScFIRSTNAME)
  880.                     'GETBIRTHDATE' PARENTSc
  881.                     PARENTScBIRTHDATE = RESULT
  882.                     'GETDEATHDATE' PARENTSc
  883.                     PARENTScDEATHDATE = RESULT
  884. /**/
  885.                     PARENTScFILENAME = 'P'PARENTSc
  886. /**/
  887. WriteCh('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.htm">')
  888. /**/
  889.                     IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
  890. WriteCh('PERSONFILE',MPARENTScFULLNAME)
  891.                     ELSE DO
  892. IF PARENTScGENDER = "m" THEN WriteCh('PERSONFILE','<B>'PARENTScFIRSTNAME'</B>')
  893. IF PARENTScGENDER = "f" THEN WriteCh('PERSONFILE','<I>'PARENTScFIRSTNAME'</I>')
  894.                         END
  895. /**/
  896. WriteCh('PERSONFILE','</A> ')
  897. /**/
  898.                     IF PARENTScBIRTHDATE ~= "" THEN
  899. WriteCh('PERSONFILE','   * 'PARENTScBIRTHDATE)
  900. /**/
  901.                     IF PARENTScDEATHDATE ~= "" THEN
  902. WriteCh('PERSONFILE','   + 'PARENTScDEATHDATE)
  903. /**/
  904. WriteLn('PERSONFILE','')
  905. IF DoGenText THEN DO
  906.     WriteCh('GenealogyText','  |_____  'PPARENTScFULLNAME)
  907. IF PARENTScBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'PARENTScBIRTHDATE)
  908. IF PARENTScDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'PARENTScDEATHDATE)
  909. WriteLn('GenealogyText','')
  910.     END
  911.                     END
  912.                 END
  913.             END
  914.         END
  915.     END
  916.  
  917. /* end of parents, siblings segment; start marriages segment */
  918.  
  919.         vert.0 = ''
  920.         vert.1 = ' |'
  921.         DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
  922.                 'GETMARRIAGE' ScionIRN i
  923.                 MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  924.                 IF MARRIAGE > -1 THEN DO
  925.                         MARRIAGES = i
  926.                         j = i + 1
  927.                         vert.j = vert.i vert.1
  928.                         END
  929.         END
  930.         tMARRIAGESt = 't'MARRIAGES't'
  931. /*    Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt    */
  932.  
  933.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  934.         WriteLn('PERSONFILE','  |')
  935.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  936.         DO i = 0 TO MARRIAGES
  937.             'GETMARRIAGE' ScionIRN i
  938.             mFGRN = RESULT
  939.             IF mFGRN ~= "" THEN DO
  940.                 ki = MARRIAGES - i + 1
  941.                 IF ki ~= MARRIAGES + 1 THEN DO
  942.                     WriteLn('PERSONFILE',vert.ki)
  943.                     IF DoGenText THEN WriteLn('GenealogyText',vert.ki)
  944.                     END
  945.                 j = MARRIAGES + 1 - i
  946.                 'GETSPOUSE' mFGRN
  947.                 SPOUSE = RESULT
  948.                 IF SPOUSE = ScionIRN THEN
  949.                     DO
  950.                     'GETPRINCIPAL' mFGRN
  951.                     SPOUSE = RESULT
  952.                     END
  953.                 'GETLASTNAME' SPOUSE
  954.                 SPOUSELASTNAME = GetLastName(RESULT)
  955.                 'GETFIRSTNAME' SPOUSE
  956.                 SPOUSEFIRSTNAME = RESULT
  957.                 thelastname = SPOUSELASTNAME
  958.                 'GETSEX' SPOUSE
  959.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  960. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  961. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  962. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  963.                 'GETBIRTHDATE' SPOUSE
  964.                 SPOUSEBIRTHDATE = RESULT
  965.                 'GETMARRYDATE' mFGRN
  966.                 MARRIAGEDATE = RESULT
  967.                 'GETMARRYPLACE' mFGRN
  968.                 mFGRNPLACE = RESULT
  969.                 'GETFAMUSER1' mFGRN
  970.                 MARRIAGECELEBRANT = CheckForReplacement(RESULT)
  971.                 MARRIAGEnCELEBRANT = CheckForNAReplacement(RESULT)
  972.                 'GETFAMUSER2' mFGRN
  973.                 MARRIAGECOMMENT = CheckForReplacement(RESULT)
  974.                 MARRIAGEnCOMMENT = CheckForNAReplacement(RESULT)
  975. /**/
  976.                 SPOUSEFILENAME = 'P'SPOUSE
  977. /**/
  978.                 IF i = 0 THEN DO
  979. WriteCh('PERSONFILE','  'MFULLNAME' //\ ')
  980.  
  981.                     IF SPOUSELASTNAME ~= "" THEN
  982. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  983.  
  984. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  985.  
  986.                     IF SPOUSELASTNAME ~= "" THEN
  987. WriteCh('PERSONFILE','</A>')
  988.  
  989. IF DoGenText THEN DO
  990.     WriteCh('GenealogyText','  'PFULLNAME' //\ 'PSPOUSEFULLNAME)
  991.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  992.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  993.     WriteLn('GenealogyText','')
  994.     END
  995.                     END
  996.  
  997.                 ELSE DO
  998. WriteCh('PERSONFILE',vert.j'_ //\ ')
  999.  
  1000.                     IF SPOUSELASTNAME ~= "" THEN
  1001. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  1002.  
  1003. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  1004.  
  1005.                     IF SPOUSELASTNAME ~= "" THEN
  1006. WriteCh('PERSONFILE','</A>')
  1007.  
  1008. IF DoGenText THEN DO
  1009.     WriteCh('GenealogyText',vert.j'_ //\ 'PSPOUSEFULLNAME)
  1010.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  1011.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  1012.     WriteLn('GenealogyText','')
  1013.     END
  1014.                     END
  1015.  
  1016.                 IF MARRIAGEDATE ~= "" THEN
  1017. WriteCh('PERSONFILE',' & 'MARRIAGEDATE)
  1018.                 IF mFGRNPLACE ~= "" THEN
  1019. WriteCh('PERSONFILE',' @ 'mFGRNPLACE)
  1020.  
  1021.                 WriteLn('PERSONFILE','')
  1022.                 jk = MARRIAGES - i
  1023.                 spcs = vert.jk'      |     '
  1024. /**/
  1025.                 FfilN = Gdir'/F'mFGRN
  1026.                 Minfo = 0
  1027.                 IF Exists('Genealogy:FN'mFGRN'.'DBNAME) THEN DO
  1028.                     Minfo = 1
  1029.                     Say 'Writing info file 'FfilN'I.htm'
  1030.                     Open('FNDBNAME','Genealogy:FN'mFGRN'.'DBNAME,'r')
  1031.                     Open('FAMILYI',FfilN'I.htm','w')
  1032. WriteLn('FAMILYI','<HTML>')
  1033. WriteCh('FAMILYI','<TITLE>'MFULLNAME' //\ ')
  1034. WriteLn('FAMILYI',MSPOUSEFULLNAME' Family Information</TITLE>')
  1035. /**/
  1036.     IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1037. /**/
  1038.         IF Exists(FfilN'.jpg') THEN DO
  1039. Parse value StateF(FfilN'.jpg') with type size blk bits PJday PJmin PJtick com
  1040. Parse value StateF('Genealogy:FP'mFGRN'.'DBNAME) with type size blk bits PPday PPmin PPtick com
  1041. Say 'Genealogy:FP'mFGRN'.'DBNAME PPday PPmin PPtick  FfilN'.jpg' PJday PJmin PJtick
  1042.             IF ( PPday > PJday ) | ( PPday = PJday & PPmin > PJmin ) THEN DO
  1043.                 Delete(FfilN'.jpg')
  1044.                 Delete(FfilN'.gif')
  1045. Say 'Scion file Genealogy:FP'mFGRN'.'DBNAME 'newer; replacing 'FfilN'.jpg'
  1046.                 END
  1047.             END
  1048. /**/
  1049. WriteCh('FAMILYI','<A HREF="F'mFGRN'A.htm')
  1050. WriteCh('FAMILYI','"><img src="F'mFGRN'.gif"></A>')
  1051.         END
  1052. /**/
  1053. WriteCh('FAMILYI','<H2>Family of 'MFULLNAME' //\ ')
  1054. WriteCh('FAMILYI',MSPOUSEFULLNAME)
  1055. /**/
  1056.     IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1057. /**/        IF Exists(FfilN'.jpg') THEN DO
  1058.             Say 'Leaving picture 'FfilN'.jpg unmodified'
  1059.             END
  1060.         ELSE DO
  1061.             Say 'Creating picture 'FfilN'.jpg'
  1062. Say 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1063. address command 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1064.             END
  1065.         IF Exists(FfilN'.gif') THEN DO
  1066.             Say 'Leaving image 'FfilN'.gif unmodified'
  1067.             END
  1068.         ELSE DO
  1069.             Say 'Creating image 'FfilN'.gif'
  1070. Say 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.gif FORMAT GIF BOXFIT 120 120'
  1071. address command 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.gif FORMAT GIF BOXFIT 120 120'
  1072.             END
  1073. WriteCh('FAMILYI',' (<A HREF="F'mFGRN'A.htm')
  1074. WriteCh('FAMILYI','"><B>Picture Album</B></A>)')
  1075.         IF Exists(FfilN'A.htm') THEN DO
  1076.             Say 'Leaving picture album 'FfilN'A.htm unmodified'
  1077.             END
  1078.         ELSE DO
  1079.             Say 'Creating picture album 'FfilN'A.htm'
  1080.             Open('FAMILYP',FfilN'A.htm','w')
  1081.             WriteLn('FAMILYP','<HTML>')
  1082.             WriteCh('FAMILYP','<TITLE>'MFULLNAME' //\ ')
  1083.             WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1084.             WriteLn('FAMILYP',' Family Picture album</TITLE>')
  1085.             WriteCh('FAMILYP',MFULLNAME' //\ ')
  1086.             WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1087.             WriteCh('FAMILYP',' <B>Family</B> . ')
  1088.             WriteCh('FAMILYP','<A HREF="F'mFGRN'.jpg">')
  1089.             WriteCh('FAMILYP','<img src="F'mFGRN'.gif"></A>')
  1090.             WriteLn('FAMILYP',' . <B>Picture Album</B><HR>')
  1091. WriteCH('FAMILYP','another JPEG picture <A HREF="F'mFGRN'a1.jpg"><img src="')
  1092. WriteLn('FAMILYP','F'mFGRN'a1.gif"></A> anchored by image')
  1093. WriteLn('FAMILYP',' created by:<P>GfxCon 'FfilN'a1.jpg TO 'FfilN'a1.gif FORMAT ')
  1094. WriteLn('FAMILYP','JPEG QUALITY 33 BOXFIT 120 120<HR>')
  1095. WriteLn('FAMILYP','<B>Edit 'FfilN'A.htm to add more pictures to the Picture Album<P>')
  1096. WriteCH('FAMILYP','CAUTION: deleting Directory: 'Gdir' destroys all Picture ')
  1097. WriteLn('FAMILYP',' Album modifications. YOUR WORK WILL BE LOST!</B>')
  1098.             WriteLn('FAMILYP','</HTML>')
  1099.             Close('FAMILYP')
  1100.             END
  1101.         END
  1102.  
  1103. WriteCh('FAMILYI',' (<A HREF="GENEAFIL.htm">')
  1104. WriteLn('FAMILYI','<B>List of persons.</B></A>)</H2><PRE><TT>')
  1105.                     DO While ~EOF('FNDBNAME')
  1106.                         line = ReadLn('FNDBNAME')
  1107.                         WriteLn('FAMILYI',CheckForReplacement(line))
  1108. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1109.                     END
  1110.                     Close('FNDBNAME')
  1111.                     WriteLn('FAMILYI','</HTML>')
  1112.                     Close('FAMILYI')
  1113.                     END
  1114. /**/
  1115.                 IF MARRIAGECELEBRANT ~= '' | Minfo THEN DO
  1116.                     WriteCh('PERSONFILE',spcs)
  1117.                     IF Minfo THEN
  1118. WriteCh('PERSONFILE','(<A HREF="F'mFGRN'I.htm"><B>family info</B></A>) ')
  1119.                     IF MARRIAGECELEBRANT ~= '' THEN DO
  1120. WriteCh('PERSONFILE',FAMLABEL1': 'MARRIAGECELEBRANT)
  1121. IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'MARRIAGEnCELEBRANT)
  1122.                         END
  1123.                     WriteLn('PERSONFILE','')
  1124.                     END
  1125.                 IF MARRIAGECOMMENT ~= '' THEN DO
  1126. WriteLn('PERSONFILE',spcs'  'FAMLABEL2': 'MARRIAGECOMMENT)
  1127. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'FAMLABEL2': 'MARRIAGEnCOMMENT)
  1128.                     END
  1129. /*********************************************************************************/
  1130.  
  1131.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  1132.         'GETCHILD' mFGRN k
  1133.         mFGRNc = RESULT
  1134.         'GETFIRSTNAME' mFGRNc
  1135.         mFGRNcFIRSTNAME = RESULT
  1136. /**/
  1137.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  1138.             HasCHILDREN = 1
  1139.             'GETLASTNAME' mFGRNc
  1140.             mFGRNcLASTNAME = GetLastName(RESULT)
  1141.             'GETFIRSTNAME' mFGRNc
  1142.             mFGRNcFIRSTNAME = RESULT
  1143.             'GETSEX' mFGRNc
  1144. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1145.             thelastname = mFGRNcLASTNAME
  1146.             thegender = mFGRNcGENDER
  1147. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1148. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1149. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1150.             'GETBIRTHDATE' mFGRNc
  1151.             mFGRNcBIRTHDATE = RESULT
  1152.             'GETDEATHDATE' mFGRNc
  1153.             mFGRNcDEATHDATE = RESULT
  1154. /**/
  1155.             mFGRNcFILENAME = 'P'mFGRNc
  1156.  
  1157.             jk = MARRIAGES - i
  1158. WriteCh('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.htm">')
  1159. /**/
  1160.             IF mFGRNcLASTNAME ~= LASTNAME THEN
  1161. WriteCh('PERSONFILE',MmFGRNcFULLNAME)
  1162.             ELSE DO
  1163. IF mFGRNcGENDER = "m" THEN WriteCh('PERSONFILE','<B>'mFGRNcFIRSTNAME'</B>')
  1164. IF mFGRNcGENDER = "f" THEN WriteCh('PERSONFILE','<I>'mFGRNcFIRSTNAME'</I>')
  1165.                 END
  1166. WriteCh('PERSONFILE','</A> ')
  1167. /**/
  1168.             IF mFGRNcBIRTHDATE ~= "" THEN
  1169. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1170. /**/
  1171.             IF mFGRNcDEATHDATE ~= "" THEN
  1172. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1173.  
  1174. Writeln('PERSONFILE','')
  1175. IF DoGenText THEN DO
  1176.     WriteCh('GenealogyText',vert.jk'      |_____ 'PmFGRNcFULLNAME)
  1177.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1178.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1179.     WriteLn('GenealogyText','')
  1180.     END
  1181.             END
  1182.         END
  1183.     END
  1184. /*********************************************************************************/
  1185.                 END
  1186.         END
  1187.     ELSE DO
  1188.         WriteLn('PERSONFILE','  |')
  1189.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  1190.         WriteLn('PERSONFILE','  'MFULLNAME)
  1191.         IF DoGenText THEN WriteLn('GenealogyText','  'PFULLNAME)
  1192.     END
  1193. /*    WriteLn('PERSONFILE','</TT></PRE>')    */
  1194.     IF HasPARENTS THEN DO
  1195.         WriteLn('PERSONFILE','<HR>')
  1196. /*        WriteLn('PERSONFILE','<TT><PRE>')    */
  1197.         IF DoGenText THEN DO
  1198.             WriteLn('GenealogyText','')
  1199.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1200.             WriteLn('GenealogyText','')
  1201.             END
  1202.         WriteLn('PERSONFILE','<LI>Ancestors of 'MFULLNAME)
  1203.         IF DoGenText THEN WriteLn('GenealogyText',' Ancestors of 'PFULLNAME)
  1204.         IF DoGenText THEN WriteLn('GenealogyText','')
  1205.         Paternal(ScionIRN,'  ')
  1206.         WriteCh('PERSONFILE',MFULLNAME)
  1207.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1208.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1209.         WriteLn('PERSONFILE','')
  1210.         IF DoGenText THEN DO
  1211.             WriteCh('GenealogyText',PFULLNAME)
  1212.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1213.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1214.             WriteLn('GenealogyText','')
  1215.             END
  1216.         Maternal(ScionIRN,'  ')
  1217. /*        WriteLn('PERSONFILE','</TT></PRE>')    */
  1218.         END
  1219. /*    ELSE */
  1220. IF HasCHILDREN THEN DO
  1221.         WriteLn('PERSONFILE','<HR>')
  1222. /*        WriteLn('PERSONFILE','<PRE><TT>')    */
  1223.         IF DoGenText THEN DO
  1224.             WriteLn('GenealogyText','')
  1225.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1226.             WriteLn('GenealogyText','')
  1227.             WriteLn('GenealogyText',' Descendants of 'PFULLNAME)
  1228.             WriteLn('GenealogyText','')
  1229.             END
  1230.         WriteLn('PERSONFILE','<LI>Descendants of 'MFULLNAME)
  1231.         indent = "  "
  1232.         WriteCh('PERSONFILE',indent||MFULLNAME)
  1233.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1234.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1235.         WriteLn('PERSONFILE','')
  1236.         IF DoGenText THEN DO
  1237.             WriteCh('GenealogyText',indent || PFULLNAME)
  1238.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1239.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1240.             WriteLn('GenealogyText','')
  1241.             END
  1242.         marriagesANDchildren(ScionIRN,indent)
  1243.         END
  1244. /*    WriteLn('PERSONFILE','<HR>')
  1245.     WriteLn('PERSONFILE','<Address>')
  1246.     'GETPROGVERSION'
  1247.     VERSION = RESULT
  1248.     WriteCh('PERSONFILE','<H3>ScionGenealogist')
  1249.     IF VERSION > 0 THEN WriteCh('PERSONFILE',' V 'VERSION)
  1250.     WriteLn('PERSONFILE',' © Robbie J Akins; ')
  1251.     WriteLn('PERSONFILE','Scion2html.rexx © Harold H. Ipolyi</H3>')
  1252.     WriteLn('PERSONFILE','</Address>')                */
  1253.     WriteLn('PERSONFILE','</TT></PRE>')
  1254.     WriteLn('PERSONFILE','</HTML>')
  1255.     Close('PERSONFILE')
  1256.     IF EndOfFile & DoGenText THEN WriteLn('GenealogyText',' ')
  1257.  
  1258.     IF target = "NORMAL" & LASTNAME ~= "" THEN DO
  1259.         WriteCh('GenealogyFile','<A HREF="'PfilN'.htm">')
  1260.         WriteCh('GenealogyFile',MFULLNAME)
  1261.         WriteCh('GenealogyFile','</A>')
  1262.         IF BIRTHDATE ~= "" THEN WriteCh('GenealogyFile','  *'BIRTHDATE)
  1263.         IF DEATHDATE ~= "" THEN WriteCh('GenealogyFile',' +'DEATHDATE)
  1264. /*********************************************************************************/
  1265. IF HasFATHER THEN DO
  1266.     WriteCh('GenealogyFile',' (()) ')
  1267.     IF HasFileFATHER THEN WriteCh('GenealogyFile','<A HREF="'FATHERFILENAME'.htm">')
  1268.     WriteCh('GenealogyFile',' 'MFATHERFULLNAME)
  1269.     IF HasFileFATHER THEN WriteCh('GenealogyFile','</A>')
  1270.     IF HasMOTHER THEN DO
  1271.         IF HasFATHER THEN WriteCh('GenealogyFile',' //\ ')
  1272.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','<A HREF="'MOTHERFILENAME'.htm">')
  1273.         WriteCh('GenealogyFile',MMOTHERFULLNAME)
  1274.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','</A>')
  1275.         END
  1276.     END
  1277. /*********************************************************************************/
  1278.     WriteLn('GenealogyFile','<BR>')    /* do not close, we have many more to go. */
  1279. END
  1280.  
  1281.     RETURN
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287. IsNumeric: PROCEDURE
  1288.     PARSE ARG str
  1289.     RETURN DataType(str, 'W')
  1290.  
  1291.  
  1292.     /* create a file name short but unique */
  1293.  
  1294. FilName: PROCEDURE
  1295.     PARSE ARG finm lanm bdate
  1296.     RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)
  1297.  
  1298. /******************************** Makedir **********************************/
  1299.  
  1300. /* Makedir - If a directory under the given name already exists, or can be
  1301.    created, return 1, otherwise return 0. Though this function works
  1302.    correctly under Workbench 1.3, it has the same effect as the existing
  1303.    MAKEDIR; hence it is useful only under 2.0.
  1304. */
  1305. Makedir: procedure
  1306.    ds = statef(arg(1))
  1307.  
  1308.    if ds='' then
  1309.       result = 'MAKEDIR'(arg(1))
  1310.    else
  1311.       result = left(ds,3) = 'DIR'
  1312.  
  1313.    return result
  1314.  
  1315. CheckForReplacement: PROCEDURE
  1316.     PARSE ARG line "<" last
  1317.     IF last = "" THEN RETURN CheckReplacement(line)
  1318.     RIRN = GetRIRN(last || ".")
  1319.     IF RIRN = 0 THEN RETURN line || "<" || last
  1320.     last = CheckForReplacement(last)        /* recursion */
  1321.     lastend = GetEnd(last || ".")
  1322.     'GETLASTNAME' RIRN
  1323.     RIRNLASTNAME = GetLastName(RESULT)
  1324.     'GETFIRSTNAME' RIRN
  1325.     RIRNFIRSTNAME = RESULT
  1326.     thelastname = RIRNLASTNAME
  1327.     'GETBIRTHDATE' RIRN
  1328.     RIRNBIRTHDATE = RESULT
  1329.     'GETSEX' RIRN
  1330.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1331.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1332.     ELSE
  1333.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1334.     IF RIRNLASTNAME = "" THEN
  1335.         RETURN line || RIRNFULLNAME || lastend
  1336.     RIRNFILENAME = 'P'RIRN
  1337.     RETURN line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1338.  
  1339. CheckReplacement: PROCEDURE
  1340.     PARSE ARG line "[" last
  1341.     IF last = "" THEN RETURN line
  1342.     RIRN = GetaRIRN(last || ".")
  1343.     IF RIRN = 0 THEN RETURN line || "[" || last
  1344.     last = CheckForReplacement(last)        /* recursion */
  1345.     lastend = GetaEnd(last || ".")
  1346.     'GETLASTNAME' RIRN
  1347.     RIRNLASTNAME = GetLastName(RESULT)
  1348.     'GETFIRSTNAME' RIRN
  1349.     RIRNFIRSTNAME = RESULT
  1350.     thelastname = RIRNLASTNAME
  1351.     'GETBIRTHDATE' RIRN
  1352.     RIRNBIRTHDATE = RESULT
  1353.     'GETSEX' RIRN
  1354.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1355.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1356.     ELSE
  1357.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1358.     IF RIRNLASTNAME = "" THEN
  1359.         RETURN line || RIRNFULLNAME || lastend
  1360.     RIRNFILENAME = 'P'RIRN
  1361.     RETURN line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1362.  
  1363. CheckForNAReplacement: PROCEDURE
  1364.     PARSE ARG line "<" last
  1365.     IF last = "" THEN RETURN CheckNAReplacement(line)
  1366.     RIRN = GetRIRN(last || ".")
  1367.     IF RIRN = 0 THEN RETURN line || "<" || last
  1368.     last = CheckForNAReplacement(last)        /* recursion */
  1369.     lastend = GetEnd(last || ".")
  1370.     'GETLASTNAME' RIRN
  1371.     RIRNLASTNAME = GetLastName(RESULT)
  1372.     'GETFIRSTNAME' RIRN
  1373.     RIRNFIRSTNAME = RESULT
  1374.     thelastname = RIRNLASTNAME
  1375.     'GETBIRTHDATE' RIRN
  1376.     RIRNBIRTHDATE = RESULT
  1377.     'GETSEX' RIRN
  1378.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1379. /*    thelastname = GetFullName(RIRNLASTNAME)                */
  1380.     thegender = GENDER
  1381.     IF thegender = "m" THEN
  1382.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1383.     ELSE
  1384.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1385.     RETURN line || RIRNFULLNAME lastend
  1386.  
  1387. CheckNAReplacement: PROCEDURE
  1388.     PARSE ARG line "[" last
  1389.     IF last = "" THEN RETURN line
  1390.     RIRN = GetaRIRN(last || ".")
  1391.     IF RIRN = 0 THEN RETURN line || "[" || last
  1392.     last = CheckForNAReplacement(last)        /* recursion */
  1393.     lastend = GetaEnd(last || ".")
  1394.     'GETLASTNAME' RIRN
  1395.     RIRNLASTNAME = GetLastName(RESULT)
  1396.     'GETFIRSTNAME' RIRN
  1397.     RIRNFIRSTNAME = RESULT
  1398.     thelastname = RIRNLASTNAME
  1399.     'GETBIRTHDATE' RIRN
  1400.     RIRNBIRTHDATE = RESULT
  1401.     'GETSEX' RIRN
  1402.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1403. /*    thelastname = GetFullName(RIRNLASTNAME)                */
  1404.     thegender = GENDER
  1405.     IF thegender = "m" THEN
  1406.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1407.     ELSE
  1408.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1409.     RETURN line || RIRNFULLNAME lastend
  1410.  
  1411. Paternal: PROCEDURE EXPOSE DoGenText
  1412.     PARSE ARG irn, indent
  1413.     'GETPARENTS' irn
  1414.     PARENTS = RESULT
  1415.     'GETPRINCIPAL' PARENTS
  1416.     PRINCIPAL = RESULT
  1417.     'GETSPOUSE' PARENTS
  1418.     SPOUSE = RESULT
  1419.     'GETSEX' PRINCIPAL
  1420.     IF RESULT = 'M' THEN DO
  1421.         FIRN = PRINCIPAL
  1422.         MIRN = SPOUSE
  1423.         END
  1424.     ELSE DO
  1425.         FIRN = SPOUSE
  1426.         MIRN = PRINCIPAL
  1427.         END
  1428.     pirn = FIRN
  1429.     IF 't'pirn't' ~= 'tt' THEN DO
  1430.         Paternal(pirn,'     'indent)
  1431.         'GETLASTNAME' pirn
  1432.         pirnLASTNAME = GetLastName(RESULT)
  1433.         thelastname = pirnLASTNAME
  1434.         'GETFIRSTNAME' pirn
  1435.         pirnFIRSTNAME = RESULT
  1436.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1437.         'GETBIRTHDATE' pirn
  1438.         pirnBIRTHDATE = RESULT
  1439.         IF pirnLASTNAME ~= "" THEN
  1440.             pirnPfilN = 'P'pirn
  1441.         WriteCh('PERSONFILE',indent'- ')
  1442.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPfilN'.htm">')
  1443.         WriteCh('PERSONFILE','<B>'pirnFULLNAME'</B>')
  1444.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1445.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1446.         'GETDEATHDATE' pirn
  1447.         pirnDEATHDATE = RESULT
  1448.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1449.         WriteLn('PERSONFILE','')
  1450.         IF DoGenText THEN DO
  1451.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1452.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1453.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1454.             WriteLn('GenealogyText','')
  1455.             END
  1456.         Maternal(pirn,'     'indent)
  1457.         END
  1458.     RETURN 0
  1459.  
  1460. Maternal: PROCEDURE EXPOSE DoGenText
  1461.     PARSE ARG irn, indent
  1462.     'GETPARENTS' irn
  1463.     PARENTS = RESULT
  1464.     'GETPRINCIPAL' PARENTS
  1465.     PRINCIPAL = RESULT
  1466.     'GETSPOUSE' PARENTS
  1467.     SPOUSE = RESULT
  1468.     'GETSEX' PRINCIPAL
  1469.     IF RESULT = 'M' THEN DO
  1470.         FIRN = PRINCIPAL
  1471.         MIRN = SPOUSE
  1472.         END
  1473.     ELSE DO
  1474.         FIRN = SPOUSE
  1475.         MIRN = PRINCIPAL
  1476.         END
  1477.     pirn = MIRN
  1478.     IF 't'pirn't' ~= 'tt' THEN DO
  1479.         Paternal(pirn,'     'indent)
  1480.         'GETLASTNAME' pirn
  1481.         pirnLASTNAME = GetLastName(RESULT)
  1482.         thelastname = pirnLASTNAME
  1483.         'GETFIRSTNAME' pirn
  1484.         pirnFIRSTNAME = RESULT
  1485.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1486.         'GETBIRTHDATE' pirn
  1487.         pirnBIRTHDATE = RESULT
  1488.         IF pirnLASTNAME ~= "" THEN
  1489.             pirnPfilN = 'P'pirn
  1490.         WriteCh('PERSONFILE',indent'- ')
  1491.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPfilN'.htm">')
  1492.         WriteCh('PERSONFILE','<I>'pirnFULLNAME'</I>')
  1493.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1494.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1495.         'GETDEATHDATE' pirn
  1496.         pirnDEATHDATE = RESULT
  1497.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1498.         WriteLn('PERSONFILE','')
  1499.         IF DoGenText THEN DO
  1500.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1501.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1502.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1503.             WriteLn('GenealogyText','')
  1504.             END
  1505.         Maternal(pirn,'     'indent)
  1506.         END
  1507.     RETURN 0
  1508.  
  1509. marriagesANDchildren: PROCEDURE EXPOSE DoGenText
  1510.         PARSE ARG ScionIRN,indent
  1511.     DO i = 0 TO 39            /*    ??? GETTOTMARRIAGES IRN ???    */
  1512.         'GETMARRIAGE' ScionIRN i
  1513.         MARRIAGE = RESULT
  1514.         IF MARRIAGE > -1 THEN DO
  1515.             MARRIAGES = i
  1516.             END
  1517.     END
  1518.     tMARRIAGESt = 't'MARRIAGES't'
  1519. /*      Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1520.  
  1521.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  1522.         DO i = 0 TO MARRIAGES
  1523.             'GETMARRIAGE' ScionIRN i
  1524.             mFGRN = RESULT
  1525.             IF mFGRN ~= "" THEN DO
  1526.                 'GETSPOUSE' mFGRN
  1527.                 SPOUSE = RESULT
  1528.                 IF SPOUSE = ScionIRN THEN
  1529.                     DO
  1530.                     'GETPRINCIPAL' mFGRN
  1531.                     SPOUSE = RESULT
  1532.                     END
  1533.                 'GETLASTNAME' SPOUSE
  1534.                 SPOUSELASTNAME = GetLastName(RESULT)
  1535.                 'GETFIRSTNAME' SPOUSE
  1536.                 SPOUSEFIRSTNAME = RESULT
  1537.                 thelastname = SPOUSELASTNAME
  1538.                 'GETSEX' SPOUSE
  1539.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1540. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1541. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  1542. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  1543.                 'GETBIRTHDATE' SPOUSE
  1544.                 SPOUSEBIRTHDATE = RESULT
  1545.                 'GETDEATHDATE' SPOUSE
  1546.                 SPOUSEDEATHDATE = RESULT
  1547.                 SPOUSEFILENAME = 'P'SPOUSE
  1548.                 WriteCH('PERSONFILE',indent'spouse: ')
  1549.                 IF SPOUSELASTNAME ~= "" THEN
  1550. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  1551. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  1552.                 IF SPOUSELASTNAME ~= "" THEN
  1553. WriteCh('PERSONFILE','</A>')
  1554.                 IF SPOUSEBIRTHDATE ~= "" THEN
  1555. WriteCh('PERSONFILE','   * 'SPOUSEBIRTHDATE)
  1556.                 IF SPOUSEDEATHDATE ~= "" THEN
  1557. WriteCh('PERSONFILE','   + 'SPOUSEDEATHDATE)
  1558.                 IF DoGenText THEN DO
  1559. WriteCh('GenealogyText',indent'spouse: 'PSPOUSEFULLNAME)
  1560.                     IF SPOUSEBIRTHDATE ~= "" THEN
  1561. WriteCh('GenealogyText','   * 'SPOUSEBIRTHDATE)
  1562.                     IF SPOUSEDEATHDATE ~= "" THEN
  1563. WriteCh('GenealogyText','   + 'SPOUSEDEATHDATE)
  1564. WriteLn('GenealogyText','')
  1565.                     END
  1566.                 WriteLn('PERSONFILE','')
  1567.     indent2 = indent || " | "
  1568.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */            
  1569.         'GETCHILD' mFGRN k
  1570.         mFGRNc = RESULT
  1571.         'GETFIRSTNAME' mFGRNc
  1572.         mFGRNcFIRSTNAME = RESULT
  1573. /**/
  1574.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  1575.             'GETLASTNAME' mFGRNc
  1576.             mFGRNcLASTNAME = GetLastName(RESULT)
  1577.             'GETFIRSTNAME' mFGRNc
  1578.             mFGRNcFIRSTNAME = RESULT
  1579.             'GETSEX' mFGRNc
  1580. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1581.             thelastname = mFGRNcLASTNAME
  1582.             thegender = mFGRNcGENDER
  1583. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1584. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1585. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1586.             'GETBIRTHDATE' mFGRNc
  1587.             mFGRNcBIRTHDATE = RESULT
  1588.             'GETDEATHDATE' mFGRNc
  1589.             mFGRNcDEATHDATE = RESULT
  1590. /**/
  1591.             mFGRNcFILENAME = 'P'mFGRNc
  1592. /**/
  1593. WriteCh('PERSONFILE',indent2||'<A HREF="'mFGRNcFILENAME'.htm">'MmFGRNcFULLNAME'</A> ')
  1594. /**/
  1595.             IF mFGRNcBIRTHDATE ~= "" THEN
  1596. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1597. /**/
  1598.             IF mFGRNcDEATHDATE ~= "" THEN
  1599. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1600.  
  1601. Writeln('PERSONFILE','')
  1602. IF DoGenText THEN DO
  1603.     WriteCh('GenealogyText',indent2||PmFGRNcFULLNAME)
  1604.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1605.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1606.     WriteLn('GenealogyText','')
  1607.     END
  1608. /**********************/
  1609.             marriagesANDchildren(mFGRNc,indent2)
  1610.             END
  1611.     END
  1612.                 END
  1613.             END
  1614.         END
  1615.     RETURN 0
  1616.  
  1617. GetRIRN: PROCEDURE
  1618.     PARSE ARG numb ">" last
  1619.     IF last = "" THEN RETURN 0
  1620.     IF IsNumeric(numb) THEN RETURN numb
  1621.     RETURN 0
  1622.  
  1623. GetaRIRN: PROCEDURE
  1624.     PARSE ARG numb "]" last
  1625.     IF last = "" THEN RETURN 0
  1626.     IF IsNumeric(numb) THEN RETURN numb
  1627.     RETURN 0
  1628.  
  1629. GetEnd: PROCEDURE
  1630.     PARSE ARG line ">" last
  1631.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1632.     RETURN substr(last,1,length(last)-1)
  1633.  
  1634. GetaEnd: PROCEDURE
  1635.     PARSE ARG line "]" last
  1636.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1637.     RETURN substr(last,1,length(last)-1)
  1638.  
  1639. GetLength: PROCEDURE
  1640.     PARSE UPPER ARG names
  1641.     nonletters = length(compress(names, xrange('A','Z')))
  1642.     RETURN Length(names) - nonletters * 4 / 10
  1643.  
  1644.     /* create a full name from first, last, and honorifics parts */
  1645.  
  1646. GetFullName: PROCEDURE EXPOSE thelastname
  1647.     PARSE ARG firstnames "," hon
  1648.     IF hon = "" THEN DO
  1649.         IF length(firstnames) > 2 THEN
  1650.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1651.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1652.         RETURN firstnames thelastname
  1653.         END
  1654.     RETURN firstnames Space(thelastname) || ","hon
  1655.     
  1656. MGetFullName: PROCEDURE EXPOSE thelastname thegender
  1657.     PARSE ARG firstnames "," hon
  1658.     gchar = "B"
  1659.     IF thegender = "f" THEN gchar = "I"
  1660.     IF hon = "" THEN DO
  1661.         IF length(firstnames) > 2 THEN
  1662.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1663.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1664.         RETURN "<"gchar">"firstnames thelastname"</"gchar">"
  1665.         END
  1666.     RETURN "<"gchar">"firstnames Space(thelastname) || ","hon"</"gchar">"
  1667.     
  1668. PGetFullName: PROCEDURE EXPOSE thelastname thegender
  1669.     PARSE ARG firstnames "," hon
  1670.     schar = "1"
  1671.     uchar = "2"
  1672.     IF thegender = "f" THEN DO
  1673.         schar = "3"
  1674.         uchar = "3"
  1675.         END
  1676.     IF hon = "" THEN DO
  1677.         IF length(firstnames) > 2 THEN
  1678.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1679.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1680.         RETURN ""schar"m"firstnames thelastname""uchar"m"
  1681.         END
  1682.     RETURN ""schar"m"firstnames Space(thelastname) || ","hon""uchar"m"
  1683.     
  1684.  
  1685.  
  1686.     /* Capitalize last name; also handle special cases! */
  1687.     /* End users must customize this code to aviod trashy output */
  1688.  
  1689. GetLastName: PROCEDURE
  1690.     PARSE ARG str
  1691.     IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
  1692.         IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
  1693.         IF str = "DEIPOLYI" THEN RETURN "deIpolyi"
  1694.         IF str = "MC GRADY" THEN RETURN "McGrady"
  1695.         IF str = "KIS RED" THEN RETURN "KisRed"
  1696.         IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
  1697.     IF str = "SCHüCH-GLICKHFELDEN" THEN RETURN "Schüch-Glickhfelden"
  1698.     ELSE
  1699.         DO
  1700.         spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  1701.         END
  1702.     RETURN substr(str,1,1)Space(spart)
  1703.